package myjava.statico;

// le classi ereditano i membri statici
public class Root1 {

   public static void main(String[] args) {

      System.out.println(Dad.s1);
      // System.out.println(Dad.s2);
      System.out.println(Dad.s3);
      System.out.println(Dad.s4);

      System.out.println("==============================");

      System.out.println(Son.s1);
      // System.out.println(Son.s2);
      System.out.println(Son.s3);
      System.out.println(Son.s4);

      System.out.println("==============================");
      Dad.sayFoo();
      System.out.println("==============================");
      Son.sayFoo();

   }
}

class Dad {

   public static String s1 = "yo1 (dad)";
   private static String s2 = "yo2 (dad)";
   protected static String s3 = "yo3 (dad)";
   static String s4 = "yo4 (dad)";

   protected static void useless() {
      System.out.println("useless (dad)");
   }

   public static void sayFoo() {
      System.out.println("this is my s1 : " + s2);
      useless();
   }
}

// le classi ereditano i membri statici
class Son extends Dad {

   /* NO POLIMORFISMO! Nel caso dei metodi di istanza i metodi overridati vengono
      usati nella loro versione overridata quando invocati da un metodo ereditato!
      Le proprieta' invece non vengono mai lette a runtime sul'oggetto in questione
      (vedi myjava.overriding.Root3.java)

      Nel caso statico c'e' ereditarieta' ma niete overriding */
   public static String s1 = "yo1 (son)";
   protected static String s3 = "yo3 (son)";

   protected static void useless() {
      System.out.println("useless (son)");
   }
}